//package com.yeban.javase.day19.test.test1;
//
//import java.io.BufferedReader;
//import java.io.IOException;
//import java.io.InputStreamReader;
//import java.io.PrintWriter;
//import java.net.ServerSocket;
//import java.net.Socket;
//import java.util.Scanner;
//import java.util.concurrent.LinkedBlockingDeque;
//import java.util.concurrent.ThreadPoolExecutor;
//import java.util.concurrent.TimeUnit;
//
///**
// * @Desc TODO
// * @Author yeban
// * @Date 2025/11/3
// */
//public class ThreadPoolTCPServer {
//
//    public static void main(String[] args) {
//        // 创建自定义线程池
//        ThreadPoolExecutor pool = new ThreadPoolExecutor(
//                2, 3,
//                60L, TimeUnit.SECONDS,
//                new LinkedBlockingDeque<Runnable>(3)
//        );
//
//        System.out.println("---------- TCPServer ----------");
//        Scanner sc = new Scanner(System.in);
//
//
//
//        // 读线程
//        pool.execute(() -> {
//            try {
//                ServerSocket ss = null;
//                Socket socket = null;
//                BufferedReader br = null;
//                // 启动服务器：客户端创建ServerSocket
//                ss = new ServerSocket(8899);
//                // 等待客户端接入
//                socket = ss.accept();
//                System.out.println("成功连接客户端：" + socket.getRemoteSocketAddress());   // 输出客户端地址
//
//                // 创建一个读的字符流
//                br = new BufferedReader(new InputStreamReader(socket.getInputStream())); // 获取客户端的内容：socket.getInputStream()
//                String str = null;      // 定义一个字符串来接收信息
//                // 读消息
//                while ((str = br.readLine()) != null) { // 把Reader流中的信息赋给str
//                    // 客户端输入exit，服务端说客户端下线了
//                    if(str.equals("exit")){
//                        System.out.println(socket.getRemoteSocketAddress() + "下线了！");   // 客户端下线
//                    } else {
//                        System.out.println(socket.getRemoteSocketAddress() + "说：" + str);   // 打印客户端输出内容
//                    }
//                }
//            } catch (IOException e) {
//                throw new RuntimeException(e);
//            } finally {
//                // 结束资源
//                if(br != null){
//                    try {
//                        br.close();
//                    } catch (IOException e) {
//                        throw new RuntimeException(e);
//                    }
//                }
//                if(socket != null){
//                    try {
//                        socket.close();
//                    } catch (IOException e) {
//                        throw new RuntimeException(e);
//                    }
//                }
//                if(ss != null){
//                    try {
//                        ss.close();
//                    } catch (IOException e) {
//                        throw new RuntimeException(e);
//                    }
//                }
//            }
//        });
//
//        // 写线程
//        pool.execute(() -> {
//            PrintWriter pw = null;
//            // 创建一个写出字符流
//            try {
//                while(true) {
//                    String str2 = sc.nextLine();    // 先把要输入的内容存到字符串中
//                    // 写消息
//                    if(str2.equals("exit")){
//                        // 如果服务器手动输入exit，手动退出该写循环，写线程结束
//                        break;
//                    }
//                    pw = new PrintWriter(socket.getOutputStream()); // 目标地址是传入socket发给客户端
//                    pw.println(str2);
//                    pw.flush();
//                }
//            } catch (IOException e) {
//                throw new RuntimeException(e);
//            } finally {
//                if(pw != null){
//                    pw.close();
//                }
//            }
//        });
//
//        // 关闭线程池
//        pool.shutdown();
//    }
//}
//
//class ServerReader implements Runnable {
//    private final Socket socket;
//
//    ServerReader(Socket socket) {
//        this.socket = socket;
//    }
//
//    @Override
//    public void run() {
//
//    }
//}
